home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / psmed / psmed01.lzh / source / menu.c < prev    next >
C/C++ Source or Header  |  1997-09-04  |  5KB  |  264 lines

  1. /*######################################
  2.  * X68 Human68k
  3.  *  psmed:汎用PSMデータエディタ
  4.  *
  5.  *  menu.c メニュー処理
  6.  *
  7.  *                     by BLACK.
  8.  *######################################
  9.  */
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <doslib.h>
  14. #include "psmed.h"
  15.  
  16. #define MENU_X 20        /* メニュー表示位置 */
  17. #define MENU_Y 5
  18.  
  19. #define MENU_ITEM_MAX 10    /* メニュー画面項目数 */
  20.  
  21. /*━━━━━━━━━━━━━━━━━━━━━━*/
  22.  
  23. static int menu_no;        /* 処理中のメニュー番号 */
  24. static int page_max;    /* ページ個数 */
  25.  
  26. /*━━━━━━━━━━━━━━━━━━━━━━*/
  27.  
  28. static void menuinit(void);
  29. static int menuedit(void);
  30. static void pagedisp(int page);
  31. static void item_mark(int page,int no);
  32.  
  33. /*━━━━━━━━━━━━━━━━━━━━━━*/
  34.  
  35. /**********************
  36.  * item_edit_m
  37.  * メニュー項目編集
  38.  *
  39.  **********************
  40.  */
  41. void edit_item_m(int no)
  42. {
  43.     edit_t *rec;
  44.     int stat;
  45.  
  46.     if (!pageedit[no]){
  47.         return;
  48.     }
  49.     rec = pageedit[no];
  50.     menu_no = rec->size;
  51.  
  52.     if (!menu[menu_no]){
  53.         return;
  54.     }
  55.  
  56.     if (menu_items_num[menu_no] <= 0){
  57.         return;
  58.     }
  59.  
  60.     menuinit();
  61.  
  62.     stat = menuedit();
  63.     if (stat < 0){
  64.         return;
  65.     }
  66.  
  67.     switch (rec->cmd){
  68.         case c_menu_b:
  69.             bufset(rec->adr,1,menu_items[menu_no][stat]);
  70.             psm_edited = TRUE;
  71.             break;
  72.         case c_menu_w:
  73.             bufset(rec->adr,2,menu_items[menu_no][stat]);
  74.             psm_edited = TRUE;
  75.             break;
  76.         case c_menu_l:
  77.             bufset(rec->adr,4,menu_items[menu_no][stat]);
  78.             psm_edited = TRUE;
  79.             break;
  80.         default:
  81.             break;
  82.     }
  83. }
  84.  
  85.  
  86. /***************************
  87.  * menuinit
  88.  * メニュー初期化
  89.  *
  90.  ***************************
  91.  */
  92. static void menuinit(void)
  93. {
  94.     int i;
  95.  
  96.     page_max = (menu_items_num[menu_no] + MENU_ITEM_MAX - 1) / MENU_ITEM_MAX;
  97.  
  98.     fputs("\x1b[m",stdout);
  99.  
  100.     C_LOCATE(MENU_X,MENU_Y);
  101.     fputs("┌",stdout);
  102.     for (i=0;i<MENU_ITEM_NAME_LEN/2;i++){
  103.         fputs("─",stdout);
  104.     }
  105.     fputs("┐",stdout);
  106.  
  107.     for (i=0;i<MENU_ITEM_MAX;i++){
  108.         C_LOCATE(MENU_X,MENU_Y+i+1);
  109.         fputs("│",stdout);
  110.         C_LOCATE(MENU_X+2+MENU_ITEM_NAME_LEN,MENU_Y+i+1);
  111.         fputs("│",stdout);
  112.     }
  113.  
  114.     C_LOCATE(MENU_X,MENU_Y+MENU_ITEM_MAX+1);
  115.     fputs("└",stdout);
  116.     for (i=0;i<MENU_ITEM_NAME_LEN/2;i++){
  117.         fputs("─",stdout);
  118.     }
  119.     fputs("┘",stdout);
  120.  
  121.     pagedisp(0);
  122. }
  123.  
  124.  
  125. /***************************
  126.  * menuedit
  127.  * 編集処理
  128.  *
  129.  ***************************
  130.  */
  131. static int menuedit(void)
  132. {
  133.     int loop_f = TRUE;
  134.     int key;
  135.     int page = 0;
  136.     int item = 0;
  137.     int stat = -1;
  138.  
  139.     while (loop_f){
  140.         key = inkey();
  141.         switch (key){
  142.             case ESC:
  143.                 loop_f = FALSE;
  144.                 break;
  145.             case ROLL_UP:
  146.                 page++;
  147.                 if (page >= page_max){
  148.                     page = page_max -1;
  149.                     break;
  150.                 }
  151.                 item = 0;
  152.                 pagedisp(page);
  153.                 break;
  154.             case ROLL_DOWN:
  155.                 page--;
  156.                 if (page < 0){
  157.                     page = 0;
  158.                     break;
  159.                 }
  160.                 item = 0;
  161.                 pagedisp(page);
  162.                 break;
  163.             case UP:
  164.                 item--;
  165.                 if (item < 0){
  166.                     item = 0;
  167.                     break;
  168.                 }
  169.                 item_mark(page,item);
  170.                 break;
  171.             case DOWN:
  172.                 item++;
  173.                 if (item >= MENU_ITEM_MAX || menu_items_num[menu_no] <= page * MENU_ITEM_MAX + item){
  174.                     item--;
  175.                     break;
  176.                 }
  177.                 item_mark(page,item);
  178.                 break;
  179.             case CR:
  180.                 stat = page * MENU_ITEM_MAX + item;
  181.                 loop_f = FALSE;
  182.                 break;
  183.             default:
  184.                 break;
  185.         }
  186.     }
  187.     return stat;
  188. }
  189.  
  190.  
  191. /***************************
  192.  * pagedisp
  193.  * ページ番号からページ表示
  194.  *
  195.  ***************************
  196.  */
  197. static void pagedisp(int page)
  198. {
  199.     int pos;
  200.     char *s;
  201.     int i,j;
  202.  
  203.     C_LOCATE(MENU_X+MENU_ITEM_NAME_LEN-8,MENU_Y);
  204.     printf("%3d/%3d",page+1,page_max);
  205.  
  206.     for (i=0;i<MENU_ITEM_MAX;i++){
  207.         C_LOCATE(MENU_X+2,MENU_Y+i+1);
  208.         pos = page * MENU_ITEM_MAX + i;
  209.         s = menu[menu_no] + MENU_ITEM_NAME_LEN * menu_items[menu_no][pos];
  210.         if (menu_items_num[menu_no] <= pos){
  211.             fputs("\x1b[35m",stdout);
  212.             for (j=0;j<MENU_ITEM_NAME_LEN/2;j++){
  213.                 fputs("-",stdout);
  214.             }
  215.             fputs("\x1b[m",stdout);
  216.         }else{
  217.             printf("%-*s",MENU_ITEM_NAME_LEN,s);
  218.         }
  219.     }
  220.     item_mark(page,-1);
  221. }
  222.  
  223.  
  224. /**********************
  225.  * item_mark
  226.  * 項目に選択用カラーを付ける。
  227.  *
  228.  **********************
  229.  */
  230. static void item_mark(int page,int no)
  231. {
  232.     static int old;
  233.  
  234.     if (no < 0){
  235.         /* 初期化用 */
  236.         old = 0;
  237.         C_LOCATE(MENU_X+2,MENU_Y+1);
  238.         printf("\x1b[41m%-*s\x1b[m",MENU_ITEM_NAME_LEN,menu[menu_no] + MENU_ITEM_NAME_LEN * (page * MENU_ITEM_MAX));
  239.         return;
  240.     }
  241.  
  242.     if (old == no){
  243.         return;        /* マークは移動していない */
  244.     }
  245.  
  246.     C_LOCATE(MENU_X+2,MENU_Y+1+no);
  247.     printf(
  248.         "\x1b[41m%-*s\x1b[m",
  249.         MENU_ITEM_NAME_LEN,
  250.         menu[menu_no] + MENU_ITEM_NAME_LEN * menu_items[menu_no][page * MENU_ITEM_MAX +no]
  251.     );
  252.  
  253.     C_LOCATE(MENU_X+2,MENU_Y+1+old);
  254.     printf(
  255.         "\x1b[m%-*s",
  256.         MENU_ITEM_NAME_LEN,
  257.         menu[menu_no] + MENU_ITEM_NAME_LEN * menu_items[menu_no][page * MENU_ITEM_MAX + old]
  258.     );
  259.  
  260.     old = no;
  261. }
  262.  
  263.  
  264.